定期ミートアップ 第43回
Shiika/exports.jsonのダウンサイズ
serdeのシリアライズ・デシリアライズをカスタマイズ
structを単一文字列にシリアライズ→nomを使ってパース
code:txt
-rw-r--r-- 1 yhara2 staff 282817 2 19 15:16 exports.json
-rw-r--r-- 1 yhara2 staff 1117232 2 19 15:16 exports.json.orig
Shiika/.newをやめる?
Array<Int>とmap<Int>で<>の意味が違う問題
code:sk
この<>は演算子
code:sk
class Array
def [](idx: Int)
...
map<Int>の方は、メソッドの型引数の指定
code:sk
module Enumerable<T>
def map<U>(f: Fn1<T, U>) -> Array<U>
...
nums.map<String>{|n| n.to_s}
これは単に nums.map{|n| n.to_s} と書けるようになった(型推論)
Array<Int>.new も、Array.new と書けるようにしたい
引数を推論する??
.newをやめる
return Some<Int>.new(3) → return Some(3)
return Some.call<T>(3)
定数参照(引数) を 定数参照.call(引数) のsyntax sugarとする(定数がCallableモジュールを実装していない場合はエラー)
code:sk
module Callable
requirement call(*args: Array<Object>) -> Object
Callableモジュールを実装するのは、Classと、Fn0, Fn1, ... (のみ?)
問題
callのシグネチャはクラスごとに違う
Arrayの場合:Array.call<T>(t: T) -> Array<T>
Someの場合:Some.call<T>(t: T) -> Some<T>
Pairの場合:Pair.call<A, B>(a: A, b: B) -> Pair<A, B>
Fn2の場合:Fn2.call<A, B, R>(a: A, b: B) -> R
であれば結局、型推論時に特別扱いが必要なのでは?
Shiika/パッケージマネージャ
今の構成
builtin/builtin.bc ←shiika build-corelibで、builtin/*.sk から作られる
builtin/exports.json ← 同じくshiika build-corelibで作られる、builtin.bcが提供するクラス/メソッドの一覧
target/debug/libskc_rustlib.a ← cd lib/skc_rustlib; cargo build で作られる
foo.bc ← shiika compile foo.skで作られる
これらをclangでリンクして実行ファイルfoo.outを作る
githubに置かれたライブラリをインストール、とかできるようにしたい
そのためにはとりあえず、「ライブラリ」をビルドできるようにしないといけない
例:csvライブラリ
code:sk
shiika-csv/
package.json5
index.sk
csv/*.sk
ext/
Cargo.toml
src/
lib.rs
*.skから、.bcとexports.jsonを生成
ext/*から、.aを生成